package virtualpostit.com;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import virtualpostit.com.R;
import com.google.gson.Gson;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.*;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import model.*;

/**
 * Classe che gestisce il Login di utenti registrati. L'utente deve possedere
 * username e password affinchè possa entrare nell'applicazione e usufruire delle
 * funzionalità offerte.
 * 
 * @author Gruppo Capo, De Notaris, Pastore e Vento
 * @since Luglio 2011
 */
public class LoginActivity extends Activity implements OnClickListener {

	/**
	 * Porta sulla quale ci sarà la comunicazione col server
	 */
	public static final int SERVER_PORT = 80;

	/**
	 * Indirizzo del server
	 */
	public static final String SERVER_HOST = "http://10.0.2.2";

	// Attributi di classe
	private static final String PREFS_NAME = "LoginPREFS";
	private static final String DEB_TAG = "LoginActivity";
	private SharedPreferences settings;
	private CheckBox rememberMe;

	/*
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	public void onCreate(Bundle icicle) {
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		super.onCreate(icicle);
		settings = getSharedPreferences(PREFS_NAME, 0);
		setContentView(R.layout.login);
		Button login = (Button) findViewById(R.id.login_button);
		rememberMe= (CheckBox)findViewById(R.id.rememberMe);
		rememberMe.setChecked(true);
		Log.i(DEB_TAG, "onCreate");
		login.setOnClickListener(this);
		if (getSharedPreferences("LoginPREFS", 0).getBoolean("rememberMe", true)){
			setUserNameText(settings.getString("username", ""));
			setPasswordText(settings.getString("password", ""));
		}

		TextView signup = (TextView) findViewById(R.id.signup_link);
		signup.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent myIntent = new Intent(v.getContext(),
						NewAccountActivity.class);
				startActivityForResult(myIntent, 0);
			}
		});
	}

	/**
	 * Metodo che imposta il campo UN col valore dell' username ricordato 
	 * all'ultimo avvio dell'applicazione qualora l'utente abbia spuntato il 
	 * pulsante opportuno
	 * 
	 * @param $username username da caricare nel campo UN
	 */
	public void setUserNameText(String $username) {
		EditText usernameEditText = (EditText) findViewById(R.id.txt_username);
		usernameEditText.setText($username);
	}

	/**
	 * Metodo che imposta il campo password col valore della password ricordata
	 * all'ultimo avvio dell'applicazione qualora l'utente abbia spuntato il 
	 * pulsante opportuno
	 * 
	 * @param $password password da caricare nel campo PW 
	 */
	public void setPasswordText(String $password) {
		EditText passwordEditText = (EditText) findViewById(R.id.txt_password);
		passwordEditText.setText($password);
	}

	/*
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	public void onClick(View v) {
		boolean cryptError=false;
		Log.i(DEB_TAG + " onClick ", "onClick");
		EditText usernameEditText = (EditText) findViewById(R.id.txt_username);
		EditText passwordEditText = (EditText) findViewById(R.id.txt_password);
		String sUserName = usernameEditText.getText().toString();
		String sPassword = passwordEditText.getText().toString();
		MyDialog md = new MyDialog(this);
		if (sUserName.equals("") || sPassword.equals("")) {
			md.showDialog("Attenzione", "Inserisci Username e Password!",R.drawable.warning);
		} else {
			String address = SERVER_HOST + ":" + SERVER_PORT;
			Log.i(DEB_TAG, "Username: " + sUserName + "Password: " + sPassword);
			Log.i(DEB_TAG, "Requesting to " + address);
			WebService login = new WebService(address);

			// Creiamo coppie chiave-valore per l'username e per la password
			ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
			params.add(new BasicNameValuePair("username", sUserName));
			try {
				params.add(new BasicNameValuePair("password", CryptMD5.MD5(sPassword)));
			} catch (NoSuchAlgorithmException e1) {
				Log.i("Errore", e1.getMessage());
				cryptError=true;
			} catch (UnsupportedEncodingException e1) {
				Log.i("Errore", e1.getMessage());
				cryptError=true;
			}
			if (!cryptError){
				String response = login.webPost("/login.php", params);
				String r = response.replace("[", "").replace("]", "").replace("\n", "");
				try {
					Log.i("response", r);
					if (r.equals("connection_error")) {
						md.showDialog("Attenzione","Connessione al servizio fallita",R.drawable.error);
					} else if (r.equals("null")) {
						md.showDialog("Attenzione",	"Username e/o password sbagliati. Riprova",	R.drawable.error);
					} else { // Login effettuato con successo
						User u = new Gson().fromJson(r, User.class);
						SharedPreferences.Editor editor = settings.edit();
						editor.putString("username", u.getUsername());
						editor.putString("password", sPassword);
						editor.putBoolean("rememberMe", rememberMe.isChecked() );
						editor.commit();
						nextActivity();
					}

				} catch (Exception e) {
					Log.i("Errore", e.getMessage());
					md.showDialog("Attenzione",	"Errore del server, riprovare più tardi",R.drawable.error);
				}
			}
			else 
				md.showDialog("Attenzione",	"Errore inaspettato, riprovare più tardi",R.drawable.error);

		}
	}

	/**
	 * Gestisce i valori di ritorno delle sottoattività 
	 * requestCode è il numero univoco associato alla sottoattività chiamata
	 * resultCode è il valore di ritorno della sottoattività
	 */
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == -1 && requestCode == 1)
			finish();
	}

	// Metodo che passa il controllo alla prossima attività volendone ricevere il risultato
	private void nextActivity() {
		Intent myIntent = new Intent(this.getBaseContext(),	GenericMapActivity.class);
		startActivityForResult(myIntent, 1);
	}

}